<!DOCTYPE html>

<html lang="en" data-content_root="../">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />

  <title>CMake 3.28 Release Notes &mdash; CMake 4.1.1 Documentation</title>

    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a2c47e09" />
    <link rel="stylesheet" type="text/css" href="../_static/cmake.css?v=4d06bd55" />
    
    <script src="../_static/documentation_options.js?v=e6a937a4"></script>
    <script src="../_static/doctools.js?v=9bcbadda"></script>
    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
    
    <link rel="icon" href="../_static/cmake-favicon.ico"/>
    <link rel="index" title="Index" href="../genindex.html" />
    <link rel="search" title="Search" href="../search.html" />
    <link rel="next" title="CMake 3.27 Release Notes" href="3.27.html" />
    <link rel="prev" title="CMake 3.29 Release Notes" href="3.29.html" />
 

  </head><body>
    <input id="sidebar-check" type="checkbox" />
    <label id="sidebar-overlay" for="sidebar-check"></label>



    <div class="related relbar1" role="navigation" aria-label="Related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="3.27.html" title="CMake 3.27 Release Notes"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="3.29.html" title="CMake 3.29 Release Notes"
             accesskey="P">previous</a> |</li>
  <li>
    <label class="sidebar-toggle" for="sidebar-check"></label>
  </li>
  <li class="rootlink">
    <img src="../_static/cmake-logo-16.png" width="16" height="16" alt=""/>
    <a href="https://cmake.org/">CMake 4.1.1</a>
    <span class="reldelim1"> &#187;</span>
  </li>
  <li>
    <a href="../index.html">Documentation</a> &#187;
  </li>

          <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">CMake Release Notes</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">CMake 3.28 Release Notes</a></li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <section id="cmake-3-28-release-notes">
<h1><a class="toc-backref" href="#id5" role="doc-backlink">CMake 3.28 Release Notes</a><a class="headerlink" href="#cmake-3-28-release-notes" title="Link to this heading">¶</a></h1>
<nav class="contents" id="contents">
<p class="topic-title">Contents</p>
<ul class="simple">
<li><p><a class="reference internal" href="#cmake-3-28-release-notes" id="id5">CMake 3.28 Release Notes</a></p>
<ul>
<li><p><a class="reference internal" href="#new-features" id="id6">New Features</a></p>
<ul>
<li><p><a class="reference internal" href="#languages" id="id7">Languages</a></p></li>
<li><p><a class="reference internal" href="#platforms" id="id8">Platforms</a></p></li>
<li><p><a class="reference internal" href="#presets" id="id9">Presets</a></p></li>
<li><p><a class="reference internal" href="#compilers" id="id10">Compilers</a></p></li>
<li><p><a class="reference internal" href="#commands" id="id11">Commands</a></p></li>
<li><p><a class="reference internal" href="#variables" id="id12">Variables</a></p></li>
<li><p><a class="reference internal" href="#properties" id="id13">Properties</a></p></li>
<li><p><a class="reference internal" href="#modules" id="id14">Modules</a></p></li>
<li><p><a class="reference internal" href="#generator-expressions" id="id15">Generator Expressions</a></p></li>
<li><p><a class="reference internal" href="#ctest" id="id16">CTest</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="#deprecated-and-removed-features" id="id17">Deprecated and Removed Features</a></p></li>
<li><p><a class="reference internal" href="#other-changes" id="id18">Other Changes</a></p></li>
<li><p><a class="reference internal" href="#updates" id="id19">Updates</a></p>
<ul>
<li><p><a class="reference internal" href="#id1" id="id20">3.28.1, 3.28.2, 3.28.3</a></p></li>
<li><p><a class="reference internal" href="#id2" id="id21">3.28.4</a></p></li>
<li><p><a class="reference internal" href="#id3" id="id22">3.28.5</a></p></li>
<li><p><a class="reference internal" href="#id4" id="id23">3.28.6</a></p></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
<p>Changes made since CMake 3.27 include the following.</p>
<section id="new-features">
<h2><a class="toc-backref" href="#id6" role="doc-backlink">New Features</a><a class="headerlink" href="#new-features" title="Link to this heading">¶</a></h2>
<section id="languages">
<h3><a class="toc-backref" href="#id7" role="doc-backlink">Languages</a><a class="headerlink" href="#languages" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>C++ 20 named modules are now supported by <a class="reference internal" href="../manual/cmake-generators.7.html#ninja-generators"><span class="std std-ref">Ninja Generators</span></a>
and <a class="reference internal" href="../manual/cmake-generators.7.html#visual-studio-generators"><span class="std std-ref">Visual Studio Generators</span></a> for VS 2022 and newer, in combination
with the MSVC 14.34 toolset (provided with VS 17.4) and newer, LLVM/Clang
16.0 and newer, and GCC 14 (after the 2023-09-20 daily bump) and newer.
See <span class="target" id="index-0-manual:cmake-cxxmodules(7)"></span><a class="reference internal" href="../manual/cmake-cxxmodules.7.html#manual:cmake-cxxmodules(7)" title="cmake-cxxmodules(7)"><code class="xref cmake cmake-manual docutils literal notranslate"><span class="pre">cmake-cxxmodules(7)</span></code></a> for details.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">HIP</span></code> language code may now be compiled for NVIDIA GPUs
using the NVIDIA CUDA Compiler (NVCC).
See the <span class="target" id="index-0-variable:CMAKE_HIP_PLATFORM"></span><a class="reference internal" href="../variable/CMAKE_HIP_PLATFORM.html#variable:CMAKE_HIP_PLATFORM" title="CMAKE_HIP_PLATFORM"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">CMAKE_HIP_PLATFORM</span></code></a> variable.</p></li>
</ul>
</section>
<section id="platforms">
<h3><a class="toc-backref" href="#id8" role="doc-backlink">Platforms</a><a class="headerlink" href="#platforms" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>On Apple platforms, <code class="docutils literal notranslate"><span class="pre">.xcframework</span></code> folders are now supported:</p>
<ul>
<li><p>The <span class="target" id="index-0-command:find_library"></span><a class="reference internal" href="../command/find_library.html#command:find_library" title="find_library"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">find_library()</span></code></a> command now finds <code class="docutils literal notranslate"><span class="pre">.xcframework</span></code> folders.</p></li>
<li><p>The <span class="target" id="index-0-command:target_link_libraries"></span><a class="reference internal" href="../command/target_link_libraries.html#command:target_link_libraries" title="target_link_libraries"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">target_link_libraries()</span></code></a> command now supports
linking against a <code class="docutils literal notranslate"><span class="pre">.xcframework</span></code> folder.</p></li>
<li><p>The <span class="target" id="index-0-prop_tgt:IMPORTED_LOCATION"></span><a class="reference internal" href="../prop_tgt/IMPORTED_LOCATION.html#prop_tgt:IMPORTED_LOCATION" title="IMPORTED_LOCATION"><code class="xref cmake cmake-prop_tgt docutils literal notranslate"><span class="pre">IMPORTED_LOCATION</span></code></a> target property of an imported
library target may now be the path to a <code class="docutils literal notranslate"><span class="pre">.xcframework</span></code> folder.</p></li>
</ul>
</li>
<li><p>Apple visionOS and its <code class="docutils literal notranslate"><span class="pre">xros</span></code> and <code class="docutils literal notranslate"><span class="pre">xrsimulator</span></code> SDKs are now supported.
Compiling for Apple visionOS can be requested by setting
<span class="target" id="index-0-variable:CMAKE_SYSTEM_NAME"></span><a class="reference internal" href="../variable/CMAKE_SYSTEM_NAME.html#variable:CMAKE_SYSTEM_NAME" title="CMAKE_SYSTEM_NAME"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">CMAKE_SYSTEM_NAME</span></code></a> to <code class="docutils literal notranslate"><span class="pre">visionOS</span></code>.
See <a class="reference internal" href="../manual/cmake-toolchains.7.html#cross-compiling-for-ios-tvos-visionos-or-watchos"><span class="std std-ref">Cross Compiling for iOS, tvOS, visionOS, or watchOS</span></a>
for more information.</p></li>
</ul>
</section>
<section id="presets">
<h3><a class="toc-backref" href="#id9" role="doc-backlink">Presets</a><a class="headerlink" href="#presets" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p><span class="target" id="index-0-manual:cmake-presets(7)"></span><a class="reference internal" href="../manual/cmake-presets.7.html#manual:cmake-presets(7)" title="cmake-presets(7)"><code class="xref cmake cmake-manual docutils literal notranslate"><span class="pre">cmake-presets(7)</span></code></a> files now support schema version <code class="docutils literal notranslate"><span class="pre">8</span></code>.
It adds support for a <code class="docutils literal notranslate"><span class="pre">$schema</span></code> field.</p></li>
</ul>
</section>
<section id="compilers">
<h3><a class="toc-backref" href="#id10" role="doc-backlink">Compilers</a><a class="headerlink" href="#compilers" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>Cray Clang-based compilers are now supported with
<span class="target" id="index-0-variable:CMAKE_&lt;LANG&gt;_COMPILER_ID"></span><a class="reference internal" href="../variable/CMAKE_LANG_COMPILER_ID.html#variable:CMAKE_&lt;LANG&gt;_COMPILER_ID" title="CMAKE_&lt;LANG&gt;_COMPILER_ID"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">compiler</span> <span class="pre">id</span></code></a> <code class="docutils literal notranslate"><span class="pre">CrayClang</span></code>.</p></li>
<li><p>The OrangeC compiler is now supported with
<span class="target" id="index-1-variable:CMAKE_&lt;LANG&gt;_COMPILER_ID"></span><a class="reference internal" href="../variable/CMAKE_LANG_COMPILER_ID.html#variable:CMAKE_&lt;LANG&gt;_COMPILER_ID" title="CMAKE_&lt;LANG&gt;_COMPILER_ID"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">compiler</span> <span class="pre">id</span></code></a> <code class="docutils literal notranslate"><span class="pre">OrangeC</span></code>.</p></li>
</ul>
</section>
<section id="commands">
<h3><a class="toc-backref" href="#id11" role="doc-backlink">Commands</a><a class="headerlink" href="#commands" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>The <span class="target" id="index-0-command:add_custom_command"></span><a class="reference internal" href="../command/add_custom_command.html#command:add_custom_command" title="add_custom_command"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">add_custom_command()</span></code></a> and <span class="target" id="index-0-command:add_custom_target"></span><a class="reference internal" href="../command/add_custom_target.html#command:add_custom_target" title="add_custom_target"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">add_custom_target()</span></code></a>
commands gained a <code class="docutils literal notranslate"><span class="pre">JOB_SERVER_AWARE</span></code> option.</p></li>
<li><p>The <span class="target" id="index-0-command:cmake_host_system_information"></span><a class="reference internal" href="../command/cmake_host_system_information.html#command:cmake_host_system_information" title="cmake_host_system_information"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">cmake_host_system_information()</span></code></a> command gained a
<code class="docutils literal notranslate"><span class="pre">MSYSTEM_PREFIX</span></code> query for the installation prefix of a MSYS
or MinGW development environment on Windows hosts.</p></li>
<li><p>The <span class="target" id="index-0-command:set_property"></span><a class="reference internal" href="../command/set_property.html#command:set_property" title="set_property"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">set_property()</span></code></a> command <code class="docutils literal notranslate"><span class="pre">TEST</span></code> mode gained a <code class="docutils literal notranslate"><span class="pre">DIRECTORY</span></code>
option to set properties on tests in other directories.</p></li>
<li><p>The <span class="target" id="index-0-command:set_tests_properties"></span><a class="reference internal" href="../command/set_tests_properties.html#command:set_tests_properties" title="set_tests_properties"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">set_tests_properties()</span></code></a> command gained a <code class="docutils literal notranslate"><span class="pre">DIRECTORY</span></code>
option to set properties on tests in other directories.</p></li>
<li><p>The <span class="target" id="index-0-command:get_property"></span><a class="reference internal" href="../command/get_property.html#command:get_property" title="get_property"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">get_property()</span></code></a> command <code class="docutils literal notranslate"><span class="pre">TEST</span></code> mode gained a <code class="docutils literal notranslate"><span class="pre">DIRECTORY</span></code>
option to get properties on tests in other directories.</p></li>
<li><p>The <span class="target" id="index-0-command:get_test_property"></span><a class="reference internal" href="../command/get_test_property.html#command:get_test_property" title="get_test_property"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">get_test_property()</span></code></a> command gained a <code class="docutils literal notranslate"><span class="pre">DIRECTORY</span></code>
option to get properties on tests in other directories.</p></li>
</ul>
</section>
<section id="variables">
<h3><a class="toc-backref" href="#id12" role="doc-backlink">Variables</a><a class="headerlink" href="#variables" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>The <span class="target" id="index-0-envvar:CMAKE_CROSSCOMPILING_EMULATOR"></span><a class="reference internal" href="../envvar/CMAKE_CROSSCOMPILING_EMULATOR.html#envvar:CMAKE_CROSSCOMPILING_EMULATOR" title="CMAKE_CROSSCOMPILING_EMULATOR"><code class="xref cmake cmake-envvar docutils literal notranslate"><span class="pre">CMAKE_CROSSCOMPILING_EMULATOR</span></code></a> environment variable
was added to initialize the <span class="target" id="index-0-variable:CMAKE_CROSSCOMPILING_EMULATOR"></span><a class="reference internal" href="../variable/CMAKE_CROSSCOMPILING_EMULATOR.html#variable:CMAKE_CROSSCOMPILING_EMULATOR" title="CMAKE_CROSSCOMPILING_EMULATOR"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">CMAKE_CROSSCOMPILING_EMULATOR</span></code></a>
cache variable.</p></li>
<li><p>The <span class="target" id="index-1-variable:CMAKE_HIP_PLATFORM"></span><a class="reference internal" href="../variable/CMAKE_HIP_PLATFORM.html#variable:CMAKE_HIP_PLATFORM" title="CMAKE_HIP_PLATFORM"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">CMAKE_HIP_PLATFORM</span></code></a> variable was added to specify
the GPU platform for which HIP language sources are to be compiled
(<code class="docutils literal notranslate"><span class="pre">amd</span></code> or <code class="docutils literal notranslate"><span class="pre">nvidia</span></code>).</p></li>
</ul>
</section>
<section id="properties">
<h3><a class="toc-backref" href="#id13" role="doc-backlink">Properties</a><a class="headerlink" href="#properties" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>On imported shared libraries, the <span class="target" id="index-0-prop_tgt:IMPORTED_IMPLIB"></span><a class="reference internal" href="../prop_tgt/IMPORTED_IMPLIB.html#prop_tgt:IMPORTED_IMPLIB" title="IMPORTED_IMPLIB"><code class="xref cmake cmake-prop_tgt docutils literal notranslate"><span class="pre">IMPORTED_IMPLIB</span></code></a> target
property may now be used without <span class="target" id="index-1-prop_tgt:IMPORTED_LOCATION"></span><a class="reference internal" href="../prop_tgt/IMPORTED_LOCATION.html#prop_tgt:IMPORTED_LOCATION" title="IMPORTED_LOCATION"><code class="xref cmake cmake-prop_tgt docutils literal notranslate"><span class="pre">IMPORTED_LOCATION</span></code></a>.
This can be used to represent a stub library whose location should not
be added as a runtime search path to dependents that link it.</p></li>
<li><p>The <span class="target" id="index-2-prop_tgt:IMPORTED_LOCATION"></span><a class="reference internal" href="../prop_tgt/IMPORTED_LOCATION.html#prop_tgt:IMPORTED_LOCATION" title="IMPORTED_LOCATION"><code class="xref cmake cmake-prop_tgt docutils literal notranslate"><span class="pre">IMPORTED_LOCATION</span></code></a> property of a macOS framework
may now be a path to the <code class="docutils literal notranslate"><span class="pre">.framework</span></code> folder itself.</p></li>
<li><p>The <span class="target" id="index-0-prop_tgt:XCODE_EMBED_&lt;type&gt;"></span><a class="reference internal" href="../prop_tgt/XCODE_EMBED_type.html#prop_tgt:XCODE_EMBED_&lt;type&gt;" title="XCODE_EMBED_&lt;type&gt;"><code class="xref cmake cmake-prop_tgt docutils literal notranslate"><span class="pre">XCODE_EMBED_RESOURCES</span></code></a> target property
was added to tell the <span class="target" id="index-0-generator:Xcode"></span><a class="reference internal" href="../generator/Xcode.html#generator:Xcode" title="Xcode"><code class="xref cmake cmake-generator docutils literal notranslate"><span class="pre">Xcode</span></code></a> generator what targets to put in
the <code class="docutils literal notranslate"><span class="pre">Embed</span> <span class="pre">Resources</span></code> build phase.</p></li>
</ul>
</section>
<section id="modules">
<h3><a class="toc-backref" href="#id14" role="doc-backlink">Modules</a><a class="headerlink" href="#modules" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>The <span class="target" id="index-0-module:ExternalProject"></span><a class="reference internal" href="../module/ExternalProject.html#module:ExternalProject" title="ExternalProject"><code class="xref cmake cmake-module docutils literal notranslate"><span class="pre">ExternalProject</span></code></a> module now includes the
<code class="docutils literal notranslate"><span class="pre">BUILD_JOB_SERVER_AWARE</span></code> option for the
<span class="target" id="index-0-command:externalproject_add"></span><a class="reference internal" href="../module/ExternalProject.html#command:externalproject_add" title="externalproject_add"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">ExternalProject_Add()</span></code></a> command. This option enables
the integration of the GNU Make job server when using an
explicit <code class="docutils literal notranslate"><span class="pre">BUILD_COMMAND</span></code> with certain <a class="reference internal" href="../manual/cmake-generators.7.html#makefile-generators"><span class="std std-ref">Makefile Generators</span></a>.
Additionally, the <span class="target" id="index-0-command:externalproject_add_step"></span><a class="reference internal" href="../module/ExternalProject.html#command:externalproject_add_step" title="externalproject_add_step"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">ExternalProject_Add_Step()</span></code></a> command
has been updated to support the new <code class="docutils literal notranslate"><span class="pre">JOB_SERVER_AWARE</span></code> option.</p></li>
<li><p>The <span class="target" id="index-0-module:FetchContent"></span><a class="reference internal" href="../module/FetchContent.html#module:FetchContent" title="FetchContent"><code class="xref cmake cmake-module docutils literal notranslate"><span class="pre">FetchContent</span></code></a> module's <span class="target" id="index-0-command:fetchcontent_declare"></span><a class="reference internal" href="../module/FetchContent.html#command:fetchcontent_declare" title="fetchcontent_declare"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">FetchContent_Declare()</span></code></a> command
gained an <code class="docutils literal notranslate"><span class="pre">EXCLUDE_FROM_ALL</span></code> option, which propagates through to the
<span class="target" id="index-0-command:add_subdirectory"></span><a class="reference internal" href="../command/add_subdirectory.html#command:add_subdirectory" title="add_subdirectory"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">add_subdirectory()</span></code></a> call made by
<span class="target" id="index-0-command:fetchcontent_makeavailable"></span><a class="reference internal" href="../module/FetchContent.html#command:fetchcontent_makeavailable" title="fetchcontent_makeavailable"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">FetchContent_MakeAvailable()</span></code></a> for the dependency.</p></li>
<li><p>The <span class="target" id="index-0-module:FindCURL"></span><a class="reference internal" href="../module/FindCURL.html#module:FindCURL" title="FindCURL"><code class="xref cmake cmake-module docutils literal notranslate"><span class="pre">FindCURL</span></code></a> module gained a <code class="docutils literal notranslate"><span class="pre">CURL_USE_STATIC_LIBS</span></code> hint
to select static libraries.</p></li>
<li><p>The <span class="target" id="index-0-module:FindEXPAT"></span><a class="reference internal" href="../module/FindEXPAT.html#module:FindEXPAT" title="FindEXPAT"><code class="xref cmake cmake-module docutils literal notranslate"><span class="pre">FindEXPAT</span></code></a> module gained an <code class="docutils literal notranslate"><span class="pre">EXPAT_USE_STATIC_LIBS</span></code> hint
to select static libraries.</p></li>
<li><p>The <span class="target" id="index-0-module:FindPkgConfig"></span><a class="reference internal" href="../module/FindPkgConfig.html#module:FindPkgConfig" title="FindPkgConfig"><code class="xref cmake cmake-module docutils literal notranslate"><span class="pre">FindPkgConfig</span></code></a> module <span class="target" id="index-0-command:pkg_get_variable"></span><a class="reference internal" href="../module/FindPkgConfig.html#command:pkg_get_variable" title="pkg_get_variable"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">pkg_get_variable()</span></code></a> command
gained a <code class="docutils literal notranslate"><span class="pre">DEFINE_VARIABLES</span></code> option to pass variables to <code class="docutils literal notranslate"><span class="pre">pkg-config</span></code>.</p></li>
</ul>
</section>
<section id="generator-expressions">
<h3><a class="toc-backref" href="#id15" role="doc-backlink">Generator Expressions</a><a class="headerlink" href="#generator-expressions" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>The <span class="target" id="index-0-manual:cmake-generator-expressions(7)"></span><a class="reference internal" href="../manual/cmake-generator-expressions.7.html#manual:cmake-generator-expressions(7)" title="cmake-generator-expressions(7)"><code class="xref cmake cmake-manual docutils literal notranslate"><span class="pre">generator</span> <span class="pre">expressions</span></code></a>
<span class="target" id="index-0-genex:IF"></span><a class="reference internal" href="../manual/cmake-generator-expressions.7.html#genex:IF" title="IF"><code class="xref cmake cmake-genex docutils literal notranslate"><span class="pre">$&lt;IF:...&gt;</span></code></a>, <span class="target" id="index-0-genex:AND"></span><a class="reference internal" href="../manual/cmake-generator-expressions.7.html#genex:AND" title="AND"><code class="xref cmake cmake-genex docutils literal notranslate"><span class="pre">$&lt;AND:...&gt;</span></code></a>, and <span class="target" id="index-0-genex:OR"></span><a class="reference internal" href="../manual/cmake-generator-expressions.7.html#genex:OR" title="OR"><code class="xref cmake cmake-genex docutils literal notranslate"><span class="pre">$&lt;OR:...&gt;</span></code></a>
short-circuit to avoid unnecessary evaluation of parameters.</p></li>
</ul>
</section>
<section id="ctest">
<h3><a class="toc-backref" href="#id16" role="doc-backlink">CTest</a><a class="headerlink" href="#ctest" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>CTest may now take a <a class="reference internal" href="../manual/ctest.1.html#ctest-resource-dynamically-generated-spec-file"><span class="std std-ref">dynamically-generated resource spec file</span></a>, which can be specified by the
<span class="target" id="index-0-prop_test:GENERATED_RESOURCE_SPEC_FILE"></span><a class="reference internal" href="../prop_test/GENERATED_RESOURCE_SPEC_FILE.html#prop_test:GENERATED_RESOURCE_SPEC_FILE" title="GENERATED_RESOURCE_SPEC_FILE"><code class="xref cmake cmake-prop_test docutils literal notranslate"><span class="pre">GENERATED_RESOURCE_SPEC_FILE</span></code></a> test property.</p></li>
</ul>
</section>
</section>
<section id="deprecated-and-removed-features">
<h2><a class="toc-backref" href="#id17" role="doc-backlink">Deprecated and Removed Features</a><a class="headerlink" href="#deprecated-and-removed-features" title="Link to this heading">¶</a></h2>
<ul class="simple">
<li><p>The <span class="target" id="index-0-command:exec_program"></span><a class="reference internal" href="../command/exec_program.html#command:exec_program" title="exec_program"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">exec_program()</span></code></a> command, which has been deprecated
since CMake 3.0, has been removed by policy <span class="target" id="index-0-policy:CMP0153"></span><a class="reference internal" href="../policy/CMP0153.html#policy:CMP0153" title="CMP0153"><code class="xref cmake cmake-policy docutils literal notranslate"><span class="pre">CMP0153</span></code></a>.
Use the <span class="target" id="index-0-command:execute_process"></span><a class="reference internal" href="../command/execute_process.html#command:execute_process" title="execute_process"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">execute_process()</span></code></a> command instead.</p></li>
<li><p>The <span class="target" id="index-0-generator:Visual Studio 11 2012"></span><a class="reference internal" href="../generator/Visual%20Studio%2011%202012.html#generator:Visual Studio 11 2012" title="Visual Studio 11 2012"><code class="xref cmake cmake-generator docutils literal notranslate"><span class="pre">Visual</span> <span class="pre">Studio</span> <span class="pre">11</span> <span class="pre">2012</span></code></a> generator has been removed.</p></li>
<li><p>The <span class="target" id="index-0-generator:Visual Studio 12 2013"></span><a class="reference internal" href="../generator/Visual%20Studio%2012%202013.html#generator:Visual Studio 12 2013" title="Visual Studio 12 2013"><code class="xref cmake cmake-generator docutils literal notranslate"><span class="pre">Visual</span> <span class="pre">Studio</span> <span class="pre">12</span> <span class="pre">2013</span></code></a> generator is now deprecated
and will be removed in a future version of CMake.</p></li>
<li><p>The <span class="target" id="index-0-prop_tgt:IOS_INSTALL_COMBINED"></span><a class="reference internal" href="../prop_tgt/IOS_INSTALL_COMBINED.html#prop_tgt:IOS_INSTALL_COMBINED" title="IOS_INSTALL_COMBINED"><code class="xref cmake cmake-prop_tgt docutils literal notranslate"><span class="pre">IOS_INSTALL_COMBINED</span></code></a> target property and corresponding
<span class="target" id="index-0-variable:CMAKE_IOS_INSTALL_COMBINED"></span><a class="reference internal" href="../variable/CMAKE_IOS_INSTALL_COMBINED.html#variable:CMAKE_IOS_INSTALL_COMBINED" title="CMAKE_IOS_INSTALL_COMBINED"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">CMAKE_IOS_INSTALL_COMBINED</span></code></a> variable have been deprecated.
Their functionality does not make sense on Apple Silicon hosts.</p></li>
<li><p>The <span class="target" id="index-1-generator:Xcode"></span><a class="reference internal" href="../generator/Xcode.html#generator:Xcode" title="Xcode"><code class="xref cmake cmake-generator docutils literal notranslate"><span class="pre">Xcode</span></code></a> generator will now issue a fatal error if
the Legacy Build System has been selected for Xcode 14 and
newer. Those Xcode versions dropped support for the Legacy Build
System and expect the project to be set-up for their current
Build System.</p></li>
</ul>
</section>
<section id="other-changes">
<h2><a class="toc-backref" href="#id18" role="doc-backlink">Other Changes</a><a class="headerlink" href="#other-changes" title="Link to this heading">¶</a></h2>
<ul>
<li><p>Generated files, in targets using <a class="reference internal" href="../command/target_sources.html#file-sets"><span class="std std-ref">File Sets</span></a>, are now considered
private by default.  Generated public headers must be specified using
file sets.  This allows <a class="reference internal" href="../manual/cmake-generators.7.html#ninja-generators"><span class="std std-ref">Ninja Generators</span></a> to produce more
efficient build graphs.  See policy <span class="target" id="index-0-policy:CMP0154"></span><a class="reference internal" href="../policy/CMP0154.html#policy:CMP0154" title="CMP0154"><code class="xref cmake cmake-policy docutils literal notranslate"><span class="pre">CMP0154</span></code></a>.</p></li>
<li><p>The <span class="target" id="index-1-command:find_library"></span><a class="reference internal" href="../command/find_library.html#command:find_library" title="find_library"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">find_library()</span></code></a>, <span class="target" id="index-0-command:find_path"></span><a class="reference internal" href="../command/find_path.html#command:find_path" title="find_path"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">find_path()</span></code></a>, and <span class="target" id="index-0-command:find_file"></span><a class="reference internal" href="../command/find_file.html#command:find_file" title="find_file"><code class="xref cmake cmake-command docutils literal notranslate"><span class="pre">find_file()</span></code></a>
commands no longer search in installation prefixes derived from the <code class="docutils literal notranslate"><span class="pre">PATH</span></code>
environment variable.  This behavior was added in CMake 3.3 to support
MSYS and MinGW (<code class="docutils literal notranslate"><span class="pre">MSYSTEM</span></code>) development environments on Windows, but
it can search undesired prefixes that happen to be in the <code class="docutils literal notranslate"><span class="pre">PATH</span></code> for
unrelated reasons.  Users who keep some <code class="docutils literal notranslate"><span class="pre">&lt;prefix&gt;/bin</span></code> directories in
the <code class="docutils literal notranslate"><span class="pre">PATH</span></code> just for their tools do not necessarily want any corresponding
<code class="docutils literal notranslate"><span class="pre">&lt;prefix&gt;/lib</span></code> or <code class="docutils literal notranslate"><span class="pre">&lt;prefix&gt;/include</span></code> directories searched.
The behavior was reverted for non-Windows platforms by CMake 3.6.
Now it has been reverted on Windows platforms too.</p>
<p>One may set the <code class="docutils literal notranslate"><span class="pre">CMAKE_PREFIX_PATH</span></code> environment variable with a
<a class="reference internal" href="../manual/cmake-language.7.html#cmake-language-lists"><span class="std std-ref">semicolon-separated list</span></a> of prefixes
that are to be searched.</p>
</li>
<li><p>When using MinGW tools in a <code class="docutils literal notranslate"><span class="pre">MSYSTEM</span></code> environment on Windows,
the <code class="docutils literal notranslate"><span class="pre">$MSYSTEM_PREFIX/local</span></code> and <code class="docutils literal notranslate"><span class="pre">$MSYSTEM_PREFIX</span></code> prefixes are
now added to <span class="target" id="index-0-variable:CMAKE_SYSTEM_PREFIX_PATH"></span><a class="reference internal" href="../variable/CMAKE_SYSTEM_PREFIX_PATH.html#variable:CMAKE_SYSTEM_PREFIX_PATH" title="CMAKE_SYSTEM_PREFIX_PATH"><code class="xref cmake cmake-variable docutils literal notranslate"><span class="pre">CMAKE_SYSTEM_PREFIX_PATH</span></code></a>.</p></li>
<li><p>The precompiled Linux <code class="docutils literal notranslate"><span class="pre">x86_64</span></code> binaries provided on
<a class="reference external" href="https://cmake.org/download/">cmake.org</a> now require GLIBC 2.17 or higher.</p></li>
</ul>
</section>
<section id="updates">
<h2><a class="toc-backref" href="#id19" role="doc-backlink">Updates</a><a class="headerlink" href="#updates" title="Link to this heading">¶</a></h2>
<p>Changes made since CMake 3.28.0 include the following.</p>
<section id="id1">
<h3><a class="toc-backref" href="#id20" role="doc-backlink">3.28.1, 3.28.2, 3.28.3</a><a class="headerlink" href="#id1" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>These versions made no changes to documented features or interfaces.
Some implementation updates were made to support ecosystem changes
and/or fix regressions.</p></li>
</ul>
</section>
<section id="id2">
<h3><a class="toc-backref" href="#id21" role="doc-backlink">3.28.4</a><a class="headerlink" href="#id2" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>Apple visionOS support has been updated for the official Xcode 15.2
release of the  <code class="docutils literal notranslate"><span class="pre">xros</span></code> and <code class="docutils literal notranslate"><span class="pre">xrsimulator</span></code> SDKs.</p></li>
</ul>
</section>
<section id="id3">
<h3><a class="toc-backref" href="#id22" role="doc-backlink">3.28.5</a><a class="headerlink" href="#id3" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>This version made no changes to documented features or interfaces.
Some implementation updates were made to C++ modules support.</p></li>
</ul>
</section>
<section id="id4">
<h3><a class="toc-backref" href="#id23" role="doc-backlink">3.28.6</a><a class="headerlink" href="#id4" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>This version made no changes to documented features or interfaces.
Some implementation updates were made to support ecosystem changes
and/or fix regressions.</p></li>
</ul>
</section>
</section>
</section>


            <div class="clearer"></div>
          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="Main">
        <div class="sphinxsidebarwrapper">
  <div>
    <h3>Table of Contents</h3>
    <ul>
<li><a class="reference internal" href="#">CMake 3.28 Release Notes</a><ul>
<li><a class="reference internal" href="#new-features">New Features</a><ul>
<li><a class="reference internal" href="#languages">Languages</a></li>
<li><a class="reference internal" href="#platforms">Platforms</a></li>
<li><a class="reference internal" href="#presets">Presets</a></li>
<li><a class="reference internal" href="#compilers">Compilers</a></li>
<li><a class="reference internal" href="#commands">Commands</a></li>
<li><a class="reference internal" href="#variables">Variables</a></li>
<li><a class="reference internal" href="#properties">Properties</a></li>
<li><a class="reference internal" href="#modules">Modules</a></li>
<li><a class="reference internal" href="#generator-expressions">Generator Expressions</a></li>
<li><a class="reference internal" href="#ctest">CTest</a></li>
</ul>
</li>
<li><a class="reference internal" href="#deprecated-and-removed-features">Deprecated and Removed Features</a></li>
<li><a class="reference internal" href="#other-changes">Other Changes</a></li>
<li><a class="reference internal" href="#updates">Updates</a><ul>
<li><a class="reference internal" href="#id1">3.28.1, 3.28.2, 3.28.3</a></li>
<li><a class="reference internal" href="#id2">3.28.4</a></li>
<li><a class="reference internal" href="#id3">3.28.5</a></li>
<li><a class="reference internal" href="#id4">3.28.6</a></li>
</ul>
</li>
</ul>
</li>
</ul>

  </div>
  <div>
    <h4>Previous topic</h4>
    <p class="topless"><a href="3.29.html"
                          title="previous chapter">CMake 3.29 Release Notes</a></p>
  </div>
  <div>
    <h4>Next topic</h4>
    <p class="topless"><a href="3.27.html"
                          title="next chapter">CMake 3.27 Release Notes</a></p>
  </div>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="../_sources/release/3.28.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
<search id="searchbox" style="display: none" role="search">
  <h3 id="searchlabel">Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
      <input type="submit" value="Go" />
    </form>
    </div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="Related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="3.27.html" title="CMake 3.27 Release Notes"
             >next</a> |</li>
        <li class="right" >
          <a href="3.29.html" title="CMake 3.29 Release Notes"
             >previous</a> |</li>
  <li>
    <label class="sidebar-toggle" for="sidebar-check"></label>
  </li>
  <li class="rootlink">
    <img src="../_static/cmake-logo-16.png" width="16" height="16" alt=""/>
    <a href="https://cmake.org/">CMake 4.1.1</a>
    <span class="reldelim1"> &#187;</span>
  </li>
  <li>
    <a href="../index.html">Documentation</a> &#187;
  </li>

          <li class="nav-item nav-item-1"><a href="index.html" >CMake Release Notes</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">CMake 3.28 Release Notes</a></li> 
      </ul>
    </div>

    <div class="footer" role="contentinfo">
    &#169; Copyright 2000-2025 Kitware, Inc. and Contributors.
      Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.1.3.
    </div>
<script type="text/javascript">
(function() {
  "use strict";
  const hide = () => document.getElementById("sidebar-check").checked = false;
  addEventListener("keydown", e => (e.key === "Escape") && hide());
  addEventListener("click", e => (e.target.tagName === "A") && hide());
  addEventListener("hashchange", hide)
})();
</script>
  </body>
</html>